// 导出一个axios的实例  而且这个实例要有请求拦截器 响应拦截器


import axios from 'axios'
import store from '@/store'
import { getTokenTimeStamp } from './auth'
import router from '@/router'
// 设置过期时间
const ExpirationTime=3600    //3600秒   1小时

// 定义一个时间戳函数
function isCheckTimeOut(){
  // 这个方法是检查token有没有过期
  // 获取现在的时间
  const curtime=Date.now()
  // (现在的时间-存储token的时间)/1000>ExpirationTime
  // 返回的结果是true  说明token已经过期了  否则没有过期
  return (curtime-getTokenTimeStamp())/1000>ExpirationTime //这里如果大于了 就说明已经过期了  就是true
}

    


// 创建了一个新的axios实例
const service = axios.create({
  // http://ihrm-java.itheima.net
  // baseURL: '/api'
  baseURL: process.env.VUE_APP_BASE_API, // ur  l = base url + request url   基础地址 和接口地址
  timeout: 5000 // 超时时间
}) 






// 请求拦截器
// service.interceptors.request.use() // 请求拦截器
// 添加请求拦截器
service.interceptors.request.use(function (config) {
  console.log('所有正常请求在到达服务器之前都经过这里',config);
//   判断是否登录  如果已经登录 直接获取token
console.log("store",store);  //得到了 store.state.user.token
const token=store.state.user.token
if(token){
// 首先要确定有token 然后在检查token有没有过期
 if(isCheckTimeOut()){
  // isCheckTimeOut()返回的结果是true token失效
  // 清空token 清空用户信息
  store.commit('user/delToken')
  store.commit('user/delUserInfo')
  // 跳转到登录页
  router.push('/login')
  // 因为token失效了 所以要手动抛出一个错误提示
  return Promise.reject(alert('token过期了,请重新登录'))
 }

// 在请求headers中统一携带token    因为接口需要token前面带有Bearer  所有使用字符串拼接
    config.headers.Authorization=`Bearer ${token}`  //
}
// config是请求对象,此对象转发给服务器
    return config;
 
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });



  
// 添加响应拦截器
service.interceptors.response.use(function (response) {
  console.log('所有正常响应在返回给浏览器之前都经过这里',response);
  // 判断是否业务错误,response.data.success=false
  if(!response.data.success) {
    // 如果业务错误,手动抛出一个错误
    return Promise.reject(new Error(response.data.message))
  }
  return response.data;   //解包裹
}, function (error) {
 console.log('所有的错误在返回浏览器之前都经过这里',error.response);
  if(error.response.status===401&&error.response.data.code===1002){
    // 清空用户信息,清空token
    store.commit('user/delToken')
    store.commit('user/delUserInfo')
    // 跳转到登录页
    router.push('/login')
  }
 return Promise.reject(error);
});


 
export default service // 导出axios实例